package gov.pr.celepar.sentinela.admin.action.consultas;

import gov.pr.celepar.sentinela.admin.action.BaseAction;
import gov.pr.celepar.sentinela.admin.excecao.SentinelaServerException;
import gov.pr.celepar.sentinela.admin.facade.LogAcessoFacade;
import gov.pr.celepar.sentinela.admin.facade.SistemaFacade;
import gov.pr.celepar.sentinela.admin.facade.UsuarioFacade;
import gov.pr.celepar.sentinela.admin.form.consultas.AcessosGeralReportForm;
import gov.pr.celepar.sentinela.admin.pojo.Grupo;
import gov.pr.celepar.sentinela.admin.pojo.LogAcesso;
import gov.pr.celepar.sentinela.admin.pojo.Usuario;
import gov.pr.celepar.framework.util.Data;
import gov.pr.celepar.framework.util.Pagina;
import java.util.Collection;
import java.util.Date;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;

public class AcessosGeralReportAction extends BaseAction {

	private static Log logger = LogFactory
			.getLog(AtivacaoAuditoriaReportAction.class);

	public String executar(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws Exception {
		try {
			AcessosGeralReportForm reportAuditForm = (AcessosGeralReportForm) form;

			// aqui populou a comboBox Sistema, pois deu um set.Attribute na
			// sessão
			this.listarSistemasAutorizados(request);

			Long codSistema = reportAuditForm.getCodSistema() != null
					&& !reportAuditForm.getCodSistema().equals("") ? Long
					.decode(reportAuditForm.getCodSistema()) : null;

			if (codSistema != null) {
				logger.debug("Sistema selecionado, vai pesquisar outros");
				Long codGrupo = reportAuditForm.getCodGrupo() != null
						&& !reportAuditForm.getCodGrupo().equals("") ? Long
						.decode(reportAuditForm.getCodGrupo()) : null;
				Long codUsuario = reportAuditForm.getCodUsuario() != null
						&& !reportAuditForm.getCodUsuario().equals("") ? Long
						.decode(reportAuditForm.getCodUsuario()) : null;

				// aqui populou a comboBox Grupos, pois deu um set.Attribute na
				// sessão
				listarGruposVinculados(codSistema, request);

				if (reportAuditForm.getCodGrupo() != null
						&& !reportAuditForm.getCodGrupo().equals("")) {

					listarUsuariosByGrupo(codGrupo, request);
				}

				logger.debug("Pegando informações de auditoria");

				// ********************************************************************************************************************
				if (reportAuditForm.getAcao() != null
						&& reportAuditForm.getAcao().equals("pesquisar")) {

					Integer limite = Integer
							.decode(reportAuditForm.getLimite());
					Date dataInicial = Data.formataData(reportAuditForm
							.getDataInicial());
					Date dataFinal = Data.formataData(reportAuditForm
							.getDataFinal());

					Integer indicePagina = new Integer(reportAuditForm
							.getIndice() == null ? "1" : reportAuditForm
							.getIndice());

					Collection<LogAcesso> acessos = LogAcessoFacade
							.listarAcessos(codSistema, codUsuario, codGrupo,
									dataInicial, dataFinal, limite);

					if (acessos != null && !acessos.isEmpty()) {
						Integer totalRegistros = new Integer(acessos.size());
						Pagina pagina = new Pagina(totalRegistros,
								indicePagina, totalRegistros);
						pagina.setRegistros(acessos);
						request.setAttribute("pagina", pagina);
					} else {
						throw new SentinelaServerException(
								"Nenhum registro encontrado! ");
					}
				}
			}
		} catch (SentinelaServerException appEx) {
			throw appEx;
		} catch (Exception e) {
			throw e;
		}
		return "lista_auditoria";
	}

	private void listarGruposVinculados(Long codSistema,
			HttpServletRequest request) throws SentinelaServerException,
			Exception {

		long[] gruposCom = this.comunicacao.getIdGrupos();
		Long codGruposCom[] = null;
		if (gruposCom != null) {
			codGruposCom = new Long[gruposCom.length];
			for (int i = 0; i < gruposCom.length; i++)
				codGruposCom[i] = Long.valueOf(gruposCom[i]);
		}

		Collection<Grupo> grupos = SistemaFacade.listarGruposVinculados(
				codSistema, new Long(this.comunicacao.getCodUsuario()),
				codGruposCom);

		request.setAttribute("listaGrupos", grupos);
	}

	private void listarUsuariosByGrupo(Long codGrupo, HttpServletRequest request)
			throws SentinelaServerException, Exception {
		Collection<Usuario> usuarios = UsuarioFacade
				.listarUsuariosByGrupo(codGrupo);

		request.setAttribute("listaUsuarios", usuarios);
	}
}
